﻿package com.simple.json;

import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

import android.util.Log;

public class Util {
	/**
	 * debug日志开关：Util.loggout的日志
	 */
	public static boolean DebugLog = false;
	/**
	 * error日志开关：Util.loggerr的日志
	 */
	public static boolean ErrorLog = false;
	/**
	 * 在日志中显示java对象和json字符串，key的不同 true表示显示。
	 */
	public static boolean ShowDiff = true;

	public static final String TAG = "Sjson";

	/**
	 * 创建泛型对象
	 * 
	 * @param cls
	 *            对象的类型
	 * @return 对象的实例
	 */
	public static <T> T createInstance(Class<T> cls) {
		T obj = null;
		try {
			obj = cls.newInstance();
		} catch (Exception e) {
			throw new IllegalStateException(e);
		}
		return obj;
	}

	/**
	 * 获取List<E> 中E的具体类型。注意：如果是泛型，会失败！
	 * 
	 * @see http://3y.uu456.com/bp-1dd622de6sce0s087732131d-1.html
	 * @param field
	 *            List类型的成员变量
	 * @return List中<E>的具体类型
	 */
	public static Class<?> getListObjectType(Field field) {
		Type type = field.getGenericType();
		if (!(type instanceof ParameterizedType)) {
			throw new IllegalStateException("Parameterized type should be used");
		}

		ParameterizedType pt = (ParameterizedType) type;
		Type[] actualTypes = pt.getActualTypeArguments();
		if (actualTypes.length > 1) {
			throw new IllegalStateException(
					"Only One parameter type is support, actuall number is:"
							+ actualTypes.length);
		}
		if (actualTypes.length == 0) {
			throw new IllegalStateException("parameter type should be used");
		}
		return (Class<?>) actualTypes[0];
	}

	/**
	 * 判断某个类是否是java定义的类
	 * 
	 * @see http://www.iteye.com/problems/58442 这个不对。。好郁闷
	 * @param clz
	 *            类型名
	 * @return 是否是java定义的类。不是返回false。
	 */
	public static boolean isJavaClass(Class<?> clz) {
		return clz != null && clz.getClassLoader() == null;
	}

	/**
	 * 输出正常日志
	 * 
	 * @param msg
	 *            日志内容
	 */
	public static void logout(String msg) {
		if (DebugLog) {
			Log.d(TAG, msg);
		}
	}

	/**
	 * 输出错误日志
	 * 
	 * @param msg
	 *            日志内容
	 */
	public static void logerr(String msg) {
		if (ErrorLog) {
			Log.w(TAG, msg);
		}
	}
	
}
